package gzdev;

import java.util.Set;

/**
 * 执行main方法来运行
 */
public class MybatisGzGenerator {

    // 运行模式
    public static volatile int MODE = GzConfig.MODE_FORMAL;

    /**
     * 1. 配置数据源（驱动类、 url、用户名、密码）、实体类（名称）、映射接口类（名称、方法）、类型转换表
     * 2. 从数据库读取表结构
     * 3. 将表结构转换成实体类，（类型转换需要配置文件）
     * 4. 将表结构和实体类转化成mybatis映射接口（注解形式）
     * 5. 3.4两步完成后均需要写入指定路径
     */
    public static void start() throws Exception {
        System.out.println("MybatisGzGen(author:gz) start");
        GzConfig config = new GzConfig();
        MODE = config.getMode();
        GzDBInfo dbInfo = new GzDBInfo(config.getDatasourceConfig());
        GenerateEntity entity = new GenerateEntity(config);
        GenerateDao dao = new GenerateDao(config);
        // 如果是自定义模式,则从配置文件中读取表名
        // 否则扫描数据库，读取该数据库的全部表名
        Set<String> tbNames = MODE == GzConfig.MODE_CONFIG ? config.getTableNames() : dbInfo.getTableNames();
        System.out.println("读取表名完毕:");
        System.out.println(String.join(",", tbNames));
        // 当前完成表数目
        int initFinished = 0;
        System.out.print(String.format("执行进度：%s/%s", initFinished, tbNames.size()));
        for (String tbName : tbNames){
            entity.outEntity(tbName, dbInfo.getTableStructure(tbName));
            dao.outDao(tbName, dbInfo.getTableStructure(tbName));
            System.out.print(String.format("%s%d/%d", getReturnChar(initFinished, 1, tbNames.size()), ++initFinished, tbNames.size()));
        }
        dbInfo.close();
        System.out.println("\n完成!");
    }

    // 获取指定长度的 /b 字符
    public static String getReturnChar(int... n0){
        int n = 0;
        for (int i : n0)
            n += String.valueOf(i).length();
        StringBuilder s = new StringBuilder();
        while (n-- > 0)
            s.append("\b");
        return s.toString();
    }
}
